<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    /* 
        闭包: 
            有权访问上级作用域变量和方法的函数
            简单的来说,就是函数在执行过程中返回了另一个或多个函数,返回的函数中使用父作用域中的变量和方法 

        形成条件
            1. 函数在执行过程中返回了另一个或多个函数
            2. 返回的函数中使用父作用域中的变量
            3. 函数外有变量引入返回的一个或多个函数

        闭包的优点
            1. 减少全局变量的使用  => 模块化出现之前,代码优化方案
            2. 可以函数外访问函数内的数据
            
        闭包的缺点:
            1. 可以函数外访问函数内的数据 => 不安全
            2. 父作用域中对应的AO对象一直得不到释放, 闭包使用过多会造成内存泄漏
    */

    /* function fn(){
        var a = 1;

        function func(){
            a ++;
            return a; // 2
        }

        return func(); // 2
    }

    var result = fn();
    console.log(result); */


    /* function fn(){
        var a = 1; // 2

        function func(){ // 函数也是一个特殊的对象  => 引用类型
            a ++;
            return a; 
        }

        return func; 
    } */


    // 返回一个函数
    function fn(){
        var a = 1; // 2

        return function (){ // 函数也是一个特殊的对象  => 引用类型
            a ++;
            return a; 
        }

    }

    var result = fn();  // result = func
    console.log(result);

    var res = result();
    console.log(res);

    var res = result();
    console.log(res);



</script>
</html>